
## 已支持第三方消息推送 Third-party message push is supported

## 💭前言

> 吹水交流：[130516740](https://qm.qq.com/cgi-bin/qm/qr?k=_M9lYFxkYD7yQQR2btyG3pkZWFys_I-l&authKey=evGDzE2eFVBm46jsHpgcWrokveg70Z9GKl3H45o0oJuia620UGeO27lDPG9gKb/2&noverify=0)

SmartSystem是为了计算机设计大赛而编写的后端程序。

事实上，我的技术并不行，这个项目写的很烂，大佬看到请完全无视，当然这个项目要是对您有所帮助那就太好了；关于更新，会随着前端项目的开发而不定期更新。

本项目免费开源，禁止拿去牟利（我想我这个烂代码也不可能牟利吧）如果发现，我会将项目删除。

**如果觉得本项目对你有帮助，请顺手点个`Star`吧QAQ ♥**

## 🌀简介

SmartSystem 是一款使用node.js编写的智慧城市后端，包括医院预约、个人中心、新闻、智慧养老、等模块，服务支持web服务器与数据库分离。
## 💡特性

- [x] **服务器分离**  程序会在每天早上自动执行签到流程，也可以随时通过部署教程的`步骤4`手动触发，具体时间参照[此处](.github/workflows/main.yml)
- [x] **自动化部署**  通过配置不同参数开启，每天将服务运行状态推送给服务器管理人员，默认关闭
- [x] **支持Token身份验证**  不同账号的`token`值不相同，超时自动失效`#`设置失效时间，如：`expiresIn: 60 * 60 * 1` 表示1h后失效
- [x] **支持多角色**  支持用户和管理员两种角色
- [x] **服务器状态推送**  服务器每次重启都会向管理员推送消息

## 📐部署

1. Fork 仓库
2. 获取 Cookie
3. 添加 Cookie 至 Secrets
4. 启用 Actions

<details>
<summary>查看教程</summary>

### 1. Fork 仓库

- 项目地址：[github/genshin-impact-helper](https://github.com/y1ndan/genshin-impact-helper)
- 点击右上角`Fork`到自己的账号下

![fork](https://i.loli.net/2020/10/28/qpXowZmIWeEUyrJ.png)

- 将仓库默认分支设置为 master 分支

### 2. 获取 Cookie

浏览器打开 https://bbs.mihoyo.com/ys/ 并登录账号

#### 2.1 方法一

- 按`F12`，打开`开发者工具`，找到`Network`并点击
- 按`F5`刷新页面，按下图复制`Cookie`

![cookie](https://i.loli.net/2020/10/28/TMKC6lsnk4w5A8i.png)

- 当触发`Debugger`时，可尝试按`Ctrl + F8`关闭，然后再次刷新页面，最后复制`Cookie`

#### 2.2 方法二

- 复制以下代码

```
var cookie = document.cookie;
var ask = confirm('Cookie:' + cookie + '\n\n是否复制内容到剪切板？');
if (ask == true) {
    copy(cookie);
    msg = cookie;
} else {
    msg = 'Cancel';
}
```

- 按`F12`，打开`开发者工具`，找到`Console`并点击
- 命令行粘贴代码并运行，获得类似`Cookie:xxxxxx`的输出信息
- `xxxxxx`部分即为所需复制的`Cookie`，点击确定复制

### 3. 添加 Cookie 至 Secrets

- 回到项目页面，依次点击`Settings`-->`Secrets`-->`New secret`

![new-secret.png](https://i.loli.net/2020/10/28/sxTuBFtRvzSgUaA.png)

- 建立名为`COOKIE`的 secret，值为`步骤2`中复制的`Cookie`内容，最后点击`Add secret`

- secret名字必须为`COOKIE`！
- secret名字必须为`COOKIE`！
- secret名字必须为`COOKIE`！

![add-secret](https://i.loli.net/2020/10/28/sETkVdmrNcCUpgq.png)

### 4. 启用 Actions

> Actions 默认为关闭状态，Fork 之后需要手动执行一次，若成功运行其才会激活。

返回项目主页面，点击上方的`Actions`，再点击左侧的`Genshin Impact Helper`，再点击`Run workflow`
    
![run](https://i.loli.net/2020/10/28/5ylvgdYf9BDMqAH.png)

</details>

至此，部署完毕。

## 🔍结果

当你完成上述流程，可以在`Actions`页面点击`Genshin Impact Helper`-->`build`-->`Run sign`查看运行日志，注意`签到结果`的提示。

<details>
<summary>查看结果</summary>

### 签到成功

如果成功，会输出类似`签到结果: 成功: 1 | 失败: 0 `的信息：

```
签到结果: 成功: 1 | 失败: 0

	NO.1 账号:
    #########2021-01-13#########
    🔅[天空岛]1******9
    今日奖励: 摩拉 × 8000
    本月累签: 13 天
    签到结果: OK
    ############################
    #########2021-01-13#########
    🔅[世界树]5******1
    今日奖励: 精锻用良矿 × 3
    本月累签: 2 天
    签到结果: OK
    ############################
```

### 签到失败

如果失败，会输出类似`签到结果: 成功: 0 | 失败: 1`的信息：

```
签到结果: 成功: 0 | 失败: 1

	NO.1 账号:
    登录失效，请重新登录
```

同时你会收到一封来自GitHub、标题为`Run failed: Genshin Impact Helper - master`的邮件。

</details>

注：若开启订阅推送，无论成功与否，都会收到推送通知。

## ⚠️第三方消息推送

因为消息推送是第三方服务，因此第三方消息推送的安全性存在风险。

**如果你不熟悉 Github 如何同步上游仓库，建议删除你 Fork 的仓库(仓库的`Settings - Options - Danger Zone - Delete this repository`)，以重新 Fork 的方式来同步更新，不要再乱点 Pull Request了～**

⚠️开启第三方消息推送后[存在的风险](https://github.com/y1ndan/genshin-impact-helper/pull/47#issuecomment-751869761)
> 这导致了Token泄露后用户被第三方攻击的隐患，而主页的协议中没有明确指出这一点。协议中同时包含了“除此之外，开发者无权获取您的 Cookie”这一陈述，而事实上开发者在此次PR后可以通过更改源代码来在用户未经授权的情况下收集用户Cookie。此前用户在使用本软件时应该默认进行代码审查，然后手动在自己的Repo里PR进行更新。现在的则跳过了这一用户授权更新的动作。

若你了解并接受自动同步带来的可能的风险，请继续往下阅读：

<details>
<summary>开启第三方消息推送</summary>

项目重新启用消息同步功能，默认关闭。

消息推送默认使用pushplus的方式，如果想自己的修改，可以编辑`push_config`文件，将`mergeMethod: hardreset`修改为`mergeMethod: merge`。

## 🔔订阅

若开启订阅推送，无论成功与否，都会收到推送通知

### Push All In One

支持pushplus和自定义推送 单个或多个推送，配置对应参数就会开启对应的推送方式，参数列表详见下文`参数`部分。

#### pushpuls

以pushpuls为例：

**a.获取 Token**

- 使用 微信扫码 登录并关注 [http://33h.co/k45yy](http://pushplus.hxtrip.com/login) 创建账号
- 点击「[发一对一推送]，获取`Token`

**b.添加 SCKEY 到 config.json**

- 建立名为`SCKEY`的 secret，并添加获取的 SCKEY 值，即可开启Server酱推送

#### 自定义推送

建立名为`PUSH_CONFIG`的 secret，并按你使用的自定义推送的文档将下列json模板填写完整

```json
{
    "method": "post",
    "url": "",
    "data": {},
    "text": "",
    "code": 200,
    "data_type": "data",
    "show_title_and_desp": false,
    "set_data_title": "",
    "set_data_sub_title": "",
    "set_data_desp": ""
}
```
```
说明:
    method: 必填,请求方式.默认: post.
    url: 必填,完整的自定义推送链接.
    data: 选填,发送的data.默认为空,可自行添加额外参数.
    text: 必填,响应体返回的状态码的key.例如: server酱的为errno.
    code: 必填,响应体返回的状态码的value.例如: server酱的为0.
    data_type: 选填,发送data的方式,可选params|json|data,默认: data.
    show_title_and_desp: 选填,是否将标题(应用名+运行状态)和运行结果合并.默认: false.
    set_data_title: 必填,填写推送方式data中消息标题的key.例如: server酱的为text.
    set_data_sub_title: 选填,填写推送方式data中消息正文的key.有的推送方式正文的key有次级结构,需配合set_data_title构造子级,与set_data_desp互斥.例如: 企业微信中,set_data_title填text,set_data_sub_title填content.
    set_data_desp: 选填,填写推送方式data中消息正文的key.例如: server酱的为desp.与set_data_sub_title互斥,两者都填则本项不生效.
```

目前只支持pushplus这一种推送方式。

## 🧬参数

在`config.json`里添加的参数，`Name`必须为下列的参数名称之一，`Value`则填写对应获取的值

|   参数名称         |   是否必填   |   默认值           |   说明                                                          |
|---                |---          |---                 |---                                                              |
|   PORT          | ❌         |       8888             |   服务运行的端口号                                                 |
|   IP          | ❌         |         127.0.0.1           |   对外开放的IP地址                                                 |
|   HOST       | ❌         |          127.0.0.1          |   数据库服务器地址                                                |
|   PASSWORD        | ✅         |                    |   数据库密码                                                 |
|   USER           | ✅         |                    |   数据库账号                                                |
|   POST  | ❌         |         3306           |   数据库服务器端口号                                                |
|   HTTP  | ❌         | http               |    http 若您的服务器支持https请在此处填写https      |                                            |
|   PUSH_PLUS_TOKEN | ❌         |                    |   pushplus一对一推送或一对多推送的token                               |
|   PUSH_PLUS_USER  | ❌         | 一对一推送          |   pushplus一对多推送的群组编码                                        |                                   |


## ❗️协议

使用 SmartSystem 即表明，您知情并同意：

- 此代码通过模拟传感器数据实现房间信息监控，如需要连接硬件获取数据可以自行重构或增加额外功能。
- 此代码并未做过代码审计且通过代码审计也并不能保证绝对安全，如果要在服务器上使用，SmartSystem 不会对您的服务器安全负责。 
- SmartSystem 不会对您的任何损失负责，包括但不限于数据泄露、服务器被攻击、数据损毁等。